#include <dos.h>
int intdosx(intno,inregs,outregs,segregs);
union REGS *inregs; значение регистров при вызове
union REGS *outregs; значение регистров при возврате
struct SREGS *segregs; значение сегментов при вызове
Описание.
Функция intdosx осуществляет выполнение системного вызова DOS , который определен значением регистра, объявленным в inregs , и возвращает результат системного вызова в outregs . В отличии от функции intdos , функция intdosx принимает значения регистров сегмента в segregs , позволяя программам, которые используют сегменты данных большой модели или far -указатели, определить, какой сегмент или указатель должен быть использован на протяжении системного вызова. Аргументы inregs и outregs являются объединениями типа REGS . Аргумент segregs является структурой типа SREGS . Эти типы объявлены в include -файле <dos.h> . Для активизации системного вызова функция intdosx выполняет команду INT 21H . Перед выполнением команды функция копирует содержимое inregs и segregs в соответствующие регистры. В segregs используются только значения регистров DS и ES . После возврата команды INT intdosx копирует текущее значение регистра в outregs и перезаписывает DS.
Она также копирует статус переносимого флага системы в поле cflag , размещенное в outregs . Если это поле является ненулевым, флаг устанавливается посредством системного вызова и указывает на условие ошибки.
Область действия функции intdosx расширяется и на область действия системных вызовов DOS , которые берут аргумент в регистре ES или значение регистра DS , отличное от умалчиваемого сегмента данных.
Возвращаемое значение.
После завершения системного вызова функция intdosx возвращает значение регистра AX . Если поле cflag в outregs является ненулевым, возникает ошибка и _doserrno также устанавливает соответствующий код ошибки.
Замечание!
Значения сегмента для аргумента segreg могут быть получены либо при использовании функции segread , либо макро FP_SEG.
Пример:
#include <dos.h>
union REGS inregs, outregs;
struct SREGS segregs;
char far *dir = "/test/bin";
/*следующий оператор заменяет текущий рабочий директорий
вызовом шеснадцатеричной функции DOS 36 */
inregs.h.ah=0x3b;
/* измененный директорий */
inregs.x.dx=FP_OFF(dir);
/* имя файла offset*/
segregs.ds=FP_SEG(dir);
/* имя файла сегмента */
intdosx(&inregs,&outregs,&segregs);